css: Fix parsing of scientific notation
authorMatthias Clasen <mclasen@redhat.com>
Sat, 29 Aug 2020 16:12:09 +0000 (12:12 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 29 Aug 2020 16:44:26 +0000 (12:44 -0400)
The parser got its chars mixed up while parsing numbers
like 2.3e-04. While it is unlikely to meet such numbers
in human-generated css, we do have them e.g. when saving
render node trees with transforms.

Also add some css parser tests for number parsing.

gtk/css/gtkcsstokenizer.c
testsuite/css/parser/number-values.css [new file with mode: 0644]
testsuite/css/parser/number-values.ref.css [new file with mode: 0644]

index 7aa3ff25e722f5c8d989299094c0623a56acbf10..607c4d6992766f3d46b7bfd0eb9686dd39ddb1b8 100644 (file)
@@ -1056,13 +1056,12 @@ gtk_css_tokenizer_read_numeric (GtkCssTokenizer *tokenizer,
         }
     }
 
-  if (data + 1 < tokenizer->end && (*data == 'e' || *data == 'E') && 
-      (g_ascii_isdigit (data[1]) || 
-       (data + 2 < tokenizer->end && (data[1] == '+' || data[2] == '-') && g_ascii_isdigit (data[2]))))
+  if (data + 1 < tokenizer->end && (*data == 'e' || *data == 'E') &&
+      (g_ascii_isdigit (data[1]) ||
+       (data + 2 < tokenizer->end && (data[1] == '+' || data[1] == '-') && g_ascii_isdigit (data[2]))))
     {
       is_int = FALSE;
       data++;
-      exponent = g_ascii_digit_value (*data);
 
       if (*data == '-')
         {
diff --git a/testsuite/css/parser/number-values.css b/testsuite/css/parser/number-values.css
new file mode 100644 (file)
index 0000000..6bb0ad0
--- /dev/null
@@ -0,0 +1,31 @@
+a {
+  -gtk-dpi: 0;
+}
+
+b {
+  -gtk-dpi: 100;
+}
+
+c {
+  -gtk-dpi: -39;
+}
+
+d {
+  -gtk-dpi: 0.5;
+}
+
+e {
+  -gtk-dpi: 2.6e2;
+}
+
+f {
+  -gtk-dpi: 2.6E20;
+}
+
+g {
+  -gtk-dpi: 5e-1;
+}
+
+h {
+  -gtk-dpi: 2E-19;
+}
diff --git a/testsuite/css/parser/number-values.ref.css b/testsuite/css/parser/number-values.ref.css
new file mode 100644 (file)
index 0000000..ba56074
--- /dev/null
@@ -0,0 +1,31 @@
+a {
+  -gtk-dpi: 0;
+}
+
+b {
+  -gtk-dpi: 100;
+}
+
+c {
+  -gtk-dpi: -39;
+}
+
+d {
+  -gtk-dpi: 0.5;
+}
+
+e {
+  -gtk-dpi: 260;
+}
+
+f {
+  -gtk-dpi: 2.6e+20;
+}
+
+g {
+  -gtk-dpi: 0.5;
+}
+
+h {
+  -gtk-dpi: 2e-19;
+}